home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE6n.s < prev    next >
Text File  |  1994-07-28  |  9KB  |  278 lines

  1.  
  2. ; Lezione6n.s    SCROLLING ORIZZONTALE MAGGIORE DI 16 PIXEL, usando il BPLCON1
  3. ;        e i BITPLANE POINTERS - TASTO DESTRO PER MUOVERE A SINISTRA
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. Inizio:
  8.     move.l    4.w,a6        ; Execbase
  9.     jsr    -$78(a6)    ; Disable
  10.     lea    GfxName(PC),a1    ; Nome lib
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  15.  
  16. ;    Puntiamo la PIC
  17.  
  18.     MOVE.L    #PIC,d0        ; dove puntare
  19.     LEA    BPLPOINTERS,A1    ; puntatori COP
  20.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  21. POINTBP:
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.     swap    d0
  26.     ADD.L    #40*256,d0    ; + lunghezza bitplane
  27.     addq.w    #8,a1
  28.     dbra    d1,POINTBP
  29.  
  30.     move.l    #COPPERLIST,$dff080    ; nostra COP
  31.     move.w    d0,$dff088        ; START COP
  32.     move.w    #0,$dff1fc        ; NO AGA!
  33.     move.w    #$c00,$dff106        ; NO AGA!
  34.  
  35. mouse:
  36.     cmpi.b    #$ff,$dff006    ; Linea 255?
  37.     bne.s    mouse
  38.  
  39.     btst    #2,$dff016    ; Tasto destro premuto?
  40.     beq.s    VaiSinistra    ; se si, vai a sinistra!
  41.  
  42.     bsr.w    Destra        ; Fa avanzare la pic verso destra modificando
  43.                 ; il bplcon1 e i bitplane pointers
  44.     bra.s    Aspetta
  45.  
  46. VaiSinistra:
  47.     bsr.w    Sinistra    ; Fa indietreggiare la pic verso sinistra.
  48.  
  49. Aspetta:
  50.     cmpi.b    #$ff,$dff006    ; linea 255?
  51.     beq.s    Aspetta
  52.  
  53.     btst    #6,$bfe001    ; mouse premuto?
  54.     bne.s    mouse
  55.  
  56.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  57.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  58.  
  59.     move.l    4.w,a6
  60.     jsr    -$7e(a6)    ; Enable
  61.     move.l    gfxbase(PC),a1
  62.     jsr    -$19e(a6)    ; Closelibrary
  63.     rts
  64.  
  65. ;    Dati
  66.  
  67. GfxName:
  68.     dc.b    "graphics.library",0,0
  69.  
  70. GfxBase:
  71.     dc.l    0
  72.  
  73. OldCop:
  74.     dc.l    0
  75.  
  76. ; Questa routine fa scorrere a destra un bitplane agendo sul BPLCON1 e sui
  77. ; puntatori ai bitplanes in copperlist. MIOBPCON1 e' il byte del BPLCON1.
  78.  
  79. Destra:
  80.     CMP.B    #$ff,MIOBPCON1    ; siamo arrivati al massimo scorrimento? (15)
  81.     BNE.s    CON1ADDA    ; se non ancora, scorri in avanti di 1
  82.                 ; con il BPLCON1
  83.  
  84.     LEA    BPLPOINTERS,A1    ; Con queste 4 istruzioni preleviamo dalla
  85.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  86.     swap    d0        ; attualmente il $dff0e0 e lo poiniamo in d0
  87.     move.w    6(a1),d0
  88.  
  89.     subq.l    #2,d0        ; punta 16 bit piu' indietro ( la PIC scorre
  90.                 ; verso destra di 16 pixel)
  91.     clr.b    MIOBPCON1    ; azzera lo scroll hardware BPLCON1 ($dff102)
  92.                 ; infatti abbiamo "saltato" 16 pixel con il
  93.                 ; bitplane pointer, ora dobbiamo ricominciare
  94.                 ; da zero con il $dff102 per scattare a
  95.                 ; destra di un pixel alla volta.
  96.  
  97.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  98.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  99. POINTBP2:
  100.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  101.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  102.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  103.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  104.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  105.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  106.     dbra    d1,POINTBP2    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  107.     rts
  108.  
  109. CON1ADDA:
  110.     add.b    #$11,MIOBPCON1    ; scorri in avanti di 1 pixel
  111.     rts
  112.  
  113. ;    Routine che sposta a sinistra in modo analogo:
  114.  
  115. Sinistra:
  116.     TST.B    MIOBPCON1    ; siamo arrivati al minimo scorrimento? (00)
  117.     BNE.s    CON1SUBBA    ; se non ancora, scorri indietro di 1
  118.                 ; con il BPLCON1
  119.  
  120.     LEA    BPLPOINTERS,A1    ; Con queste 4 istruzioni preleviamo dalla
  121.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  122.     swap    d0        ; attualmente il $dff0e0 e lo poiniamo in d0
  123.     move.w    6(a1),d0
  124.  
  125.     addq.l    #2,d0        ; punta 16 bit piu' avanti ( la PIC scorre
  126.                 ; verso sinistra di 16 pixel)
  127.     move.b    #$FF,MIOBPCON1    ; scroll hardware a 15 - BPLCON1 ($dff102)
  128.  
  129.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  130.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  131. POINTBP3:
  132.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  133.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  134.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  135.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  136.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  137.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  138.     dbra    d1,POINTBP3    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  139.     rts
  140.  
  141. CON1SUBBA:
  142.     sub.b    #$11,MIOBPCON1    ; scorri indietro di 1 pixe
  143.     rts
  144.  
  145.  
  146.     SECTION    GRAPHIC,DATA_C
  147.  
  148. COPPERLIST:
  149.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  150.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  151.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  152.     dc.w    $13e,0
  153.  
  154.     dc.w    $8E,$2c81    ; DiwStrt
  155.     dc.w    $90,$2cc1    ; DiwStop
  156.     dc.w    $92,$38        ; DdfStart
  157.     dc.w    $94,$d0        ; DdfStop
  158.     dc.w    $102        ; BplCon1
  159.     dc.b    0        ; byte "alto" inutilizzato del $dff102
  160. MIOBPCON1:
  161.     dc.b    0        ; byte "basso" utilizzato del $dff102
  162.     dc.w    $104,0        ; BplCon2
  163.     dc.w    $108,0        ; Bpl1Mod
  164.     dc.w    $10a,0        ; Bpl2Mod
  165.  
  166.             ; 5432109876543210
  167.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  168.  
  169. BPLPOINTERS:
  170.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  171.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  172.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  173.  
  174.     dc.w    $0180,$000    ; color0
  175.     dc.w    $0182,$475    ; color1
  176.     dc.w    $0184,$fff    ; color2
  177.     dc.w    $0186,$ccc    ; color3
  178.     dc.w    $0188,$999    ; color4
  179.     dc.w    $018a,$232    ; color5
  180.     dc.w    $018c,$777    ; color6
  181.     dc.w    $018e,$444    ; color7
  182.  
  183.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  184.  
  185.  
  186.     dcb.b    80*40,0    ; spazio azzerato per lo scroll del bitplane
  187.  
  188. PIC:
  189.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  190.  
  191.     dcb.b    40,0
  192.  
  193.     end
  194.  
  195. Orribile l'errore scattoso di visualizzazione al bordo sinistro dello schermo,
  196. eh?? Toglierlo non e' difficile, basta cambiare due cosucce, vediamo come e
  197. perche': il perche' avviene questo inconveniente e' da ricercare nel fatto che
  198. spostando la figura senza informare i canali DMA li troviamo "impreparati" e
  199. non fanno in tempo a leggere bene i primi 16 pixel a sinistra.
  200. Per evitare questo cosa possiamo fare? Nulla.
  201. Pero' possiamo far avvenire il pasticcio fuori dallo "schermo visibile", vi
  202. ricordate il DIWSTART e il DIWSTOP? Determinano la grandezza della finestra
  203. dove sono visualizzati i dati. E' chiaro che se facciamo partire la finestra
  204. 16 pixel piu' a destra il problema viene "tappato":
  205.  
  206.     dc.w    $8E,$2c91    ; DiwStrt ($81+16=$91)
  207.  
  208. Provate a cambiare il valore ed eseguite nuovamente il listato. Anche se
  209. abbiamo "tappato" l'errore pero' ora abbiamo uno schemo largo 304 pixel
  210. anziche' 320 e anche decentrato!!
  211. Ma in nostro aiuto vengono i registri DDFSTART e DDFSTOP! Questi registri
  212. si occupano anche loro della grandezza della finestra video, ma in maniera
  213. diversa, infatti mentre il DIWSTART/DIWSTOP e' come un cartoncino nero con
  214. una fessura ridimensionabile come vediamo nella figura sotto,
  215.  
  216.     #####################
  217.     #####################
  218.     #####        #####
  219.     #####    figura  #####
  220.     #####        #####
  221.     #####        #####
  222.     #####        #####
  223.     #####        #####
  224.     #####        #####
  225.     #####################
  226.     #####################
  227.  
  228. se cambiamo il DDFSTART/STOP cambiamo proprio la lunghezza di una linea video,
  229. per esempio se allunghiamo lo schermo di 16 pixel, facendolo diventare di
  230. 336 pixel per linea, ossia 42 bytes anziche' 40, dovremo visualizzarci una
  231. figura larga proprio 42 pixel per linea.
  232. Il modo OVERSCAN, che allarga la figura visualizzabile oltre i normali 320x256
  233. o 640x256, viene ottenuto con i DDFSTART/STOP, ricordandosi ovviamente di
  234. "allargare" anche la finestra con DIWSTART/DISTOP.
  235. torniamo al problema: noi dobbiamo fare in modo che quell'errore largo 16 pixel
  236. avvenga fuori dalla nostra vista. Basta far cominciare lo schermo col DDFSTART
  237. 16 pixel prima, facendoolo finire alla stessa posizione, e lasciare i valori
  238. normali di DIWSTART/DIWSTOP, per cui vediamo sempre 320x256 pixel, ma la
  239. finestra video e' larga in realta' 336 pixel e l'errore sta avvenendo fuori
  240. dalla nostra vista. La figura pero' diventa larga 42 bytes, dunque dobbiamo
  241. bilanciare quei 2 bytes (16 pixel) ogni linea. Come facciamo ogni termine linea
  242. (che ora avviene al pixel 42) a tornare indietro di 2 per visualizzare la
  243. linea correttamente? Insomma per far tornare i conti? Basta sottrarre al modulo
  244. corrente 2. Nel nostro caso, col modulo a ZERO, basta mettere -2.
  245. Per far partire lo schermo 16 pixel prima occorre modificare in questo modo
  246. il DATA FETCH START (DDFSTRT):
  247.  
  248.     dc.w    $92,$30            ; DDFSTART = $30 (schermo che parte
  249.                     ; 16 pixel prima, allungandosi a
  250.                     ; 42 bytes per linea, 336 pixel di
  251.                     ; larghezza, ma il DIWSTART "nasconde"
  252.                     ; questi primi 16 pixel con l'errore.
  253.  
  254.  
  255.     dc.w    $108,-2            ; MODULI = -2, dobbiamo "saltare" i
  256.     dc.w    $10a,-2            ; primi 16 pixel di ogni linea
  257.                     ; facendoli leggere 2 volte.
  258.  
  259.  
  260. Fate questa modifica e rimettete a posto il DIWSTART:
  261.  
  262.     dc.w    $8E,$2c81    ; DiwStrt
  263.  
  264. Ora lo scroll e' PERFETTO. C'e' solo il particolare che aumentando tramite
  265. l'OVERSCAN le dimensioni della finestra video viene annullato lo sprite 7,
  266. ossia l'ultimo sprite.
  267.  
  268. P.S: Se volete dare una sbirciatina all'errore che continua ad esistere in
  269. OVERSCAN fuori dalla finestra fate iniziare il DIWSTART 16 pixel prima:
  270.  
  271.     dc.w    $8E,$2c71    ; DiwStrt
  272.  
  273. E' sempre li'!!!! Ma nessuno lo puo' piu' vedere ora.
  274.  
  275. Avete visto che era facile togliere l'errore? Basta far iniziare prima di 16
  276. pixel il DDFSTART (a $30) e togliere 2 al valore dei moduli.
  277.  
  278.